import fs from 'fs';
import { fork } from 'child_process';

import chokidar from 'chokidar';  // 使用 chokidar 替代 fs.watchFile
import dotenv from 'dotenv';

// 导入 updater.js 模块
import { updateFiles, isUpdatingFiles } from './updater.js';


import { fileURLToPath } from 'url';
import path from 'path';
// 路径设置
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const parentDir = path.dirname(__dirname);
console.log(`\n-------------------------`);
const now = new Date();
console.log(`\n[${now.toString()}]\n`);
console.log(`载入 *Main_document.js`);




// 配置文件路径
const filepath = `${parentDir}/config/配置.env`;
const config = dotenv.parse(fs.readFileSync(filepath, 'utf8'));

// 打印配置信息
const wexthtml = `http://${config.wextIP}/api?json&key=${config.wextKey}`;
console.log(`\n-------------------------`);
console.log('接口IP:', `${config.wextIP}`);
console.log('小e天KEY:', `${config.wextKey}`);
console.log('机器人微信ID:', `${config.weixid}`);
console.log(`-------------------------\n`);

// 动态导入数据模块
const {bot} = await import(getImportPath(`${parentDir}/Script/datax.js`));

// 动态导入服务器模块
const { start } = await import(getImportPath(`${parentDir}/Script/Server.js`));

// 处理路径，确保兼容性
function getImportPath(filePath) {
      // 检查是否是 Windows 系统
        if (process.platform === 'win32') {
                // 在 Windows 系统中添加 file:// 前缀
                    return `file://${filePath}`;
        }
          // 在其他系统中直接返回路径
            return filePath;
}


// 用来记录正在运行的插件进程
let currentProcesses = {};  // 存储每个插件的进程
// 获取 tap_data 目录下所有子文件夹中的 mian.js 文件路径
const tap_datax = path.join(parentDir, 'tap_data');
// 监听插件目录下的文件变化
function watchPlugins() {
  chokidar.watch(tap_datax, { persistent: true })
    .on('add', (path) => handlePluginChange(path))
    .on('change', (path) => handlePluginChange(path))
    .on('unlink', (path) => handlePluginRemove(path));
}


// 插件文件发生变化时的处理函数
function handlePluginChange(pluginPath) {
  const pluginKey = path.basename(path.dirname(pluginPath));
  
  const parentDir = path.dirname(pluginPath);
const Name = path.basename(parentDir);

  if (pluginPath.endsWith('mian.js')) {
    console.log(`初始化插件 [${Name}] ，正在重新启动...`);
    restartPlugin(pluginPath, pluginKey);
  }
}

// 插件文件被删除时的处理函数
function handlePluginRemove(pluginPath) {
  const pluginKey = path.basename(path.dirname(pluginPath));
  if (currentProcesses[pluginKey]) {
  const parentDir = path.dirname(pluginPath);
const Name = path.basename(parentDir);

    console.log(`插件 ${Name} 被删除，停止该插件进程...`);
    currentProcesses[pluginKey].kill('SIGINT');
    delete currentProcesses[pluginKey];
  }
}

// 启动插件
function startPlugin(pluginPath, pluginKey) {
  if (currentProcesses[pluginKey]) {
    console.log(`停止上一个插件: ${pluginKey}...`);
    currentProcesses[pluginKey].kill('SIGINT');
  }




  // 启动 mian.js 插件
  const currentProcess = fork(pluginPath);
  currentProcesses[pluginKey] = currentProcess;

  currentProcess.on('message', (msg) => {
   // console.log(`来自插件 ${pluginKey} 的信息:`, msg);
  });

  currentProcess.on('error', (err) => {
    console.error(`插件 ${pluginKey} 错误:`, err);
  });

  currentProcess.on('exit', (code) => {
    if (code !== 0) {
      console.log(`插件 ${pluginKey} 崩溃，退出码 ${code}`);
    }
    delete currentProcesses[pluginKey];  // 移除已退出的进程
  });
}

// 重启插件
function restartPlugin(pluginPath, pluginKey) {
  //console.log(`正在重启插件: ${pluginKey}...`);
  startPlugin(pluginPath, pluginKey);
}

// 强行终止所有插件进程
function terminateAllPlugins() {
let msg;
  // 遍历所有插件进程并终止它们
  Object.keys(currentProcesses).forEach((pluginKey) => {
    const process = currentProcesses[pluginKey];
    msg=`${msg} 停止插件: ${pluginKey}...`;
    process.kill('SIGINT');  // 发送终止信号
});
  // 清空 currentProcesses 对象
  currentProcesses = {};
  console.log(`\n-------------------------\n`);
  console.log('所有插件已被终止。');
  return msg;
}

// 启动服务器_____________________________________________________________________
const botFunctions = await bot();

async function startServer() {
  start((requestData) => {
  const data=requestData;
  let wxid=data.data.memid
//微信id
let wixhm=data.data.memalias
//发送人 微信号
let wixmc=data.data.memname
//发送人 微信名
let wixmc2=data.data.nickName2
//发送人 微信群名
let utypex=data.data.utype
//判断 (私聊 群聊)
let nickName=data.data.nickName
//发送人 群名
let qunid=data.data.fromid
//判断 群id （发送id）

//________消息分类_____________________________________________________________________
let msgx = `${data.data.msg}`
if(msgx.match(/<msg><emoji/)){
msgx="[表情包]"
}
if(msgx.match(/img/)){
msgx="[图片]"
}

if(msgx.match(/<appmsg appid="" sdkver="0">/)){
msgx="[引用 分享 卡片 消息]"
}

  const now = new Date();
  console.log(`\n---------------------\n[${now.toString()}]\n---------------------`);
//_____________________________________________________________________________
if (qunid == config.weixid){
//自己发消息
console.log(`自己发 [${config.weixid}] 发送到 [${data.data.toid}]`)
console.log(`自己发送：${msgx}`)
}else{
////_____________________________________________________________________________

if (utypex == "2051" ||   utypex == "3"){
//私聊
console.log(`私聊 [${qunid}] 发送到 [${data.data.toid}] 的消息: `)
console.log(`微信id: ${data.data.alias}`)
console.log(`微信名称: ${data.data.nickName}`)
console.log(` `)
console.log(`发送：${msgx}`)
}
//_____________________________________________________________________________
if (utypex == "2050" ||   utypex == "2"){
//群里
console.log(`群聊 [${data.data.toid}] 发送到 [${qunid}] 的消息: `)
console.log(`群名称: ${nickName}`)
console.log(`群内名称: ${data.data.nickName2}`)
console.log(`微信号: ${data.data.memalias}`)
console.log(`微信名称: ${data.data.memname}`)
console.log(` `)
console.log(`发送：${msgx}`)
}

//_____________________________________________________________________________
if (utypex == "2051" ||  utypex == "2050" ||  utypex == "2" ||   utypex == "3"){


if (data.data.msg=="测试") {
botFunctions.Text(wexthtml,qunid,`测试成功！`)
}

if (data.data.msg=="清理一下") {
if (botFunctions.chat_logs(wexthtml)){
botFunctions.Text(wexthtml,qunid,`清理成功！`)
}else{

}
}


if (data.data.msg=="更新数据") {
let msh=terminateAllPlugins()
// 调用 updateFiles 函数来更新文件
updateFiles().then(() => {
    console.log(`文件更新成功:${msh}`);
 botFunctions.Text(wexthtml,qunid,`文件更新成功:${msh}`)
    watchPlugins()//从新运行
  })
  .catch((error) => {
    console.error('文件更新失败:', error);
  });
}



}
}

    Object.keys(currentProcesses).forEach(pluginKey => {
      currentProcesses[pluginKey].send(requestData);  // 向插件发送数据
    });
  });
}

// 主函数
function main() {
  watchPlugins();  // 监听 tap_data 文件夹中所有插件的变化
  startServer();  // 启动服务器
}
// 执行主函数
main();
